package com.usian.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.usian.mapper.TbUserMapper;
import com.usian.pojo.TbUser;
import com.usian.redis.RedisClient;
import com.usian.service.SSOService;
import com.usian.utils.MD5Utils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.*;

/**
 * 用户注册与登录业务层
 */
@Service
@Transactional
public class SSOServiceImpl implements SSOService {
    @Resource
    private TbUserMapper tbUserMapper;
    @Resource
    RedisClient redisClient;
    //对用户的注册信息(用户名与电话号码)做数据校验
    @Override
    public Boolean checkUserInfo(String checkValue, Integer checkFlag) {
        QueryWrapper<TbUser> tbUserQueryWrapper = new QueryWrapper<>();
        // 1、查询条件根据参数动态生成：1、2分别代表username、phone
        if (checkFlag==1){
            tbUserQueryWrapper.eq("username",checkValue);
        } else if (checkFlag==2){
            tbUserQueryWrapper.eq("phone",checkValue);
        }
        // 2、从tb_user表中查询数据
        List<TbUser> tbUsers = tbUserMapper.selectList(tbUserQueryWrapper);
        // 3、判断查询结果，如果查询到数据返回false。
        if (tbUsers==null || tbUsers.size()<=0){
            // 5、如果有返回false。
            return true;
        }
        // 4、如果没有返回true。
        return false;
    }
    //用户注册
    @Override
    public Integer userRegister(TbUser user) {
        //将密码做加密处理。
        String pwd = MD5Utils.digest(user.getPassword());
        user.setPassword(pwd);
        //补齐数据
        user.setCreated(new Date());
        user.setUpdated(new Date());
        return this.tbUserMapper.insert(user);
    }
    //用户登录
    @Override
    public Map userLogin(String username, String password) {
        // 1、判断用户名密码是否正确。
        String pwd = MD5Utils.digest(password);
        QueryWrapper<TbUser> tbUserQueryWrapper = new QueryWrapper<>();
        tbUserQueryWrapper.eq("username",username);
        tbUserQueryWrapper.eq("password",pwd);
        List<TbUser> userList = tbUserMapper.selectList(tbUserQueryWrapper);
        if(userList == null || userList.size() <= 0){
            return null;
        }
        TbUser tbUser = userList.get(0);
        // 2、登录成功后生成token。Token相当于原来的jsessionid，字符串，可以使用uuid。
        String token = UUID.randomUUID().toString();
        // 3、把用户信息保存到redis。Key就是token，value就是TbUser对象转换成json。
        tbUser.setPassword(null);
        //这里为了省时间就没有像课程上那样把时间和名字配置在配置文件里
        redisClient.set("USER_INFO:" + token, tbUser);
        // 5、设置key的过期时间。模拟Session的过期时间。
        redisClient.expire("USER_INFO:" + token, 604800);
        //new一个map往回传参数
        Map<String,String> map = new HashMap<String,String>();
        map.put("token",token);
        map.put("userid",tbUser.getId().toString());
        map.put("username",tbUser.getUsername());
        return map;

    }
    //查询用户登录是否过期
    @Override
    public TbUser getUserByToken(String token) {
        TbUser tbUser = (TbUser) redisClient.get("USER_INFO:" + token);
        if(tbUser!=null){
            //需要重置key的过期时间。
            redisClient.expire("USER_INFO:"+token,604800);
            return tbUser;
        }
        return null;
    }

    @Override
    public Boolean logOut(String token) {
        return redisClient.del("USER_INFO:" + token);
    }
}
